
プロ ジェクトホーム >> トップページ >> 開発に参加したい方へ >> cvs2svnによるリポジトリ変換
2006.03.18
Sourceforge.netのSubversionリポジトリにソースコードを登録すべくcvs2svnでcvsリポジトリの変換 を行った記録です.
最初はcygwinを使おうとしたが,どうも怪しいのでやめた.
Python,Subversionはインストーラでインストールした上で環境変数でパスを通しておく.TortoiseSVNはイン ストーラでインストール.sort, tee, coと関連dllは面倒くさいのでcvs2svnを展開したディレクトリにコピー.
http://cvs2svn.tigris.orgに てリ リース版1.3.0が公開されているが,それを使ってはいけない.上でインストールしたTortoiseSVNを使って http://cvs2svn.tigris.org/svn/cvs2svn/trunk/ から取得する.空のディレクトリを作成してそこで右クリック.「SVN Checkout」を選んで上のURLを指定.認証を求められるのでuser/pass にguest/guestを入力.
リリース版を使わない最大の理由はその速度.リリース版に比べて10倍のスピードアップが図られている.また,今回使う--auto- propsというオプションもリリース版ではサポートされていない.(cvs2svn.htmlには既に載っている)
今回取得したcvs2svnはRevision 1793のもの.取得したらsort, tee, coをその中へコピー.
不都合な点があったので,以下の変更を加えた.
Index: cvs2svn
===================================================================
--- cvs2svn (revision 1803)
+++ cvs2svn (working copy)
@@ -532,7 +532,7 @@
self.cvs_module = module_component + "/" + self.cvs_module
- os.environ['CVSROOT'] = self.cvs_repository_root
+ os.environ['CVSROOT'] = ":local:" + self.cvs_repository_root
def cvs_ok(global_arguments):
check_command_runs(
@@ -4793,7 +4793,7 @@
return s
def _add_pattern(self, pattern, value):
- props = value.split(';')
+ props = value.split(';;')
propdict = {}
for prop in props:
s = prop.split('=', 1)
CVSROOTにWindowsパスを設定するところで,cvsがそれを理解しないためエラーとなる.それを防ぐためCVSROOTの 設定箇所で先頭に無理矢理 :local: を付ける.(前回1.3.0+cvsを使って試したときは必要だったが,今回は不要だったかも)
propsによるファイルパターンによるproperty設定箇所でセミコロンを値に含むプロパティが記述できないので,区切り文字を セミコロン1つから2つに変更してセミコロンを値として解釈できるようにした.
拡張子やファイルパターに応じて自動的にプロパティを設定させるため,以下の内容のファイルをcvs2svn.configとして作 成.
[auto-props]
*.c = svn:eol-style=native;;svn:mime-type=text/plain;charset=SHIFT_JIS
*.cpp = svn:eol-style=native;;svn:mime-type=text/plain;charset=SHIFT_JIS
*.h = svn:eol-style=native;;svn:mime-type=text/plain;charset=SHIFT_JIS
*.hm = svn:eol-style=native;;svn:mime-type=text/plain;charset=SHIFT_JIS
*.hh = svn:eol-style=native;;svn:mime-type=text/plain;charset=SHIFT_JIS
*.dsp = svn:eol-style=CRLF;;svn:mime-type=text/plain;charset=SHIFT_JIS
*.dsw = svn:eol-style=CRLF;;svn:mime-type=text/plain;charset=SHIFT_JIS
*.txt = svn:eol-style=native;;svn:mime-type=text/plain;charset=SHIFT_JIS
*.rc = svn:eol-style=native;;svn:mime-type=text/plain;charset=SHIFT_JIS
*.mak = svn:eol-style=native;;svn:mime-type=text/plain;charset=SHIFT_JIS
*.def = svn:eol-style=native;;svn:mime-type=text/plain
*.png = svn:mime-type=image/png
*.jpg = svn:mime-type=image/jpeg
*.bmp = svn:mime-type=image/bmp
*.ico = svn:mime-type=image/x-icon
*.cur = svn:mime-type=application/octet-stream
Makefile = svn:eol-style=native;;svn:mime-type=text/plain;charset=SHIFT_JIS
README = svn:eol-style=native;;svn:mime-type=text/plain
.cvsignore = svn:eol-style=native;;svn:mime-type=text/plain
このリストに(過去にあったファイルも含めて)もれなく設定するために実際には以下のような手順を踏んだ.
charsetの設定はTracを使う場合には文字化け対策の意味を持つが,ViewVCを使っているSourceforge.net では特に意味をなさない.だが,将来的に意味を持つと期待して設定することにした.
CVSの中で新リポジトリに変換するのが望ましくないファイルを変換対象から除外.サクラエディタでは過去に以下のようなファイルが含 まれていた.
最新のリポジトリをコピーして望ましくないリビジョンファイルを削除した.
.cvsignoreはSubversionでは意味を持たないが,cvs2svnが.cvsignoreの中身を自動的にフォルダに Propertyとして設定してくれるので先に削除はしない.
CVSではラベル名にピリオドが使えなかったが,Subversionでは使えるので,この際変換することにした.また,意味を持たな いラベルを除外した.
変換は--symbol-transform="変換前:変換後"で,変換前で(パターン1)とした部分を変換後の方で\1として (sed みたいに)参照できる.このオプションは複数設定可能.
除外したいラベルは--excludeで指定.こちらは正規表現の(|)を使ってたくさんあっても1つにまとめて指定できる.除外はシ ンボル変換の後で処理されるので変換後のパターンで指定する必要がある.
どのように変換するか決まったら実行.teeを使ってログファイルに落とす.CVSリポジトリにはsakuraとBregexpが入っ ているので,それぞれを別々にダンプファイルに変換して,サブディレクトリに読み込ませることにする.
長いがそれぞれ1行.ラベル操作が大部分を占めている.完了するとsakura.dump及びbregexp.dumpが作られる.実 行時間はsakuraが400秒前後,Bregexpが5秒前後.Bregexpだけに-v (verbose)が付いているのはsakuraだとログが長くなりすぎるのでやめただけ.
TortoiseSVNの「Create Repository Here」で空のディレクトリにFSFS形式のリポジトリを作成.それを別の空のディレクトリへチェックアウトする.
dumpをサブディレクトリへ展開するためには展開先が存在する必要があるので,sakura, Bregexpのディレクトリを作成 してAdd.ついでにtsvn:logminsizeプロパティを指定した.Addを行った時点でSVN管理ファイルと認識されてプロパティの設定が可能 となる.ディレクトリを作り終わったら親ディレクトリ(すなわちroot)を右クリックしてSVN Commitを実行.
その後で,上で作ったログを
svnadmin load --parent-dir Bregexp ..\svnroot < bregexp.dump
svnadmin load --parent-dir sakura ..\svnroot < sakura.dump
SourceForge.netでは--parent-dirを指定してのloadが可能なので上の別々のdumpファイルのままでよ い.代わりに上の結合手順をsourceforge.netのリポジトリに対して直接行う.手で行うと忘れたりするので,上の手順をバッチファイルに作っ ておいて,一気に行うのが安心.
mkdir Bregexp
mkdir sakura
mkdir help
mkdir work
svn add sakura Bregexp help work
svn propset tsvn:logtemplate 5 Bregexp sakura help
Sourceforge.netにログインして,Admin - Subversionを選択.最初にあるEnable Subversion?の チェックをクリックしてUpdate.これでメニューにSubversionが現れる.
dumpファイルをproject disk spaceのルートへ転送する.gz, bz2, zipがサポートされているとあるので,いずれかを使ってまずは圧縮.その際ファイル名はアルファベットとピリオド以外は使えない.またサブディレクトリにおいてもダメ.
転送が完了したら上と同じくSourceforge.netにログインして,Admin - Subversionのページへ.ページ中央にMigration Instructions:というところがあり,その文中のmigrateからリンクが張られている(わかりづらい).
その先へ移動するとImportするデータ形式,ファイル名,インポート先を指定する画面になるので,それぞれSVN dumpfile,圧縮ファイル名,読み込み先を指定する.実行してから24時間以内に完了するとあるので,ステータスがWAITING→IN PROGRESS→COMPLETEDと変わるまで気長に待つ.
当初cygwinからcvs2svnを行ったら全てのファイルにsvn:executable属性が付けられてしまった.Linux同 様にファイルの実行フラグを反映しているのかもしれない.
cvs2svnの実行中に間違いに気付いてCTRL+Cで処理を中断した場合作業ファイルが残る.それらを削除しないと次の実行時に異 常終了することがある.